'use strict';

/** 小程序的AppID */
const MP_APP_ID = "wx6e0575f65cf58e81";

/** 小程序的Secret */
const MP_APP_SECRET = "83efe2e372b78bbb7578556257f55baa";

module.exports = {
	_before: function () { // 通用预处理器
	},
	
	async getMpAccessToken() {
		let url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + MP_APP_ID + "&secret=" + MP_APP_SECRET;
		// console.log(url);
		const res = await uniCloud.httpclient.request(url, {
			method: "GET",
			dataType: "json", // 此处指定为json表示将此请求的返回值解析为json
			timeout: 30000
		});
		// console.log("res",res);
		return res.data.access_token;
	},
	
	async getMpQrCode(data) {
		let accessToken = await this.getMpAccessToken();
		console.log('accessToken=', accessToken);
		
		let url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken;
		const res = await uniCloud.httpclient.request(url, {
			method: "POST",
			timeout: 30000, 
			data: JSON.stringify(data)
		});
		console.log("res",res);
		return res;
	},
	
	async saveMpQrcode(filePath, data) {
		// 保存到云存储
		let fileRes = await uniCloud.uploadFile({
			cloudPath: filePath,
			fileContent: data, 
			cloudPathAsRealPath: true
		})
		console.log('fileRes:', fileRes)
		return fileRes;
	},
	
	/**
	 * 创建并保存用户小程序二维码（如果二维码已存在，则不创建）
	 * @param {Object} userId 用户ID
	 */
	async createAndSaveUserQrCode(userId) {
		let qrcodePath = 'pages/launch/welcome?page=card&fromUser=' + userId;
		
		// 将fileID存储到用户数据中mpQrCode
		// 获取用户信息
		const db = uniCloud.database();
		const userRes = db.collection("mp-user").doc(userId);
		let userInfos = await userRes.get();
		if (userInfos.data.length > 0) {
			let userInfo = userInfos.data[0];
			console.log('mp-user userInfo:', userInfo);
			// 判断是否需要生成qrcode
			if (userInfo.mpQrCode === undefined || userInfo.mpQrCode == null || userInfo.mpQrCode == '') {
				// 获取qrcode
				let info = {
					path: qrcodePath,
					width: 600,
					env_version: 'release'  // 打开小程序版本：正式版为 "release"，体验版为 "trial"，开发版为 "develop"
				}
				const qrCodeRes = await this.getMpQrCode(info);
				
				let fileExt = 'jpg'
				let typeArr = qrCodeRes.headers['content-type'].split('/');
				if (typeArr.length > 1) {
					fileExt = typeArr[1];
				}
				let filePath = userId + "/qrcode/" + 'personQrCode' + '.' + fileExt;
				// 保存到云存储
				let fileRes = await this.saveMpQrcode(filePath, qrCodeRes.data);
				// 更新用户表中的mpQrCode
				const updateRes = await userRes.update({ mpQrCode: fileRes.fileID });
				
				return { code: 1, msg: '创建成功，保存到云存储', mpQrCode: fileRes.fileID };
			} else {
				// 已有qrcode，不需要重新获取和生成
				return { code: 2, msg: '已有qrcode，不需要重新获取和生成', mpQrCode: userInfo.mpQrCode };
			}
		}
		
		return { code: 1, msg: '错误：无用户信息', mpQrCode: '' };
	},
	
	/**
	 * 创建并保存会议签到小程序二维码（如果二维码已存在，则不创建）
	 * @param {string} meetingId 会议ID
	 * @param {string} userId 用户ID(生成小程序码的用户ID)
	 */
	async createAndSaveMeetingQrCode(meetingId, userId) {
		let qrcodePath = 'pages/launch/welcome' + 
						 '?page=MeetingCheckIn' + 
						 '&meetingId=' + meetingId + 
						 '&fromUser=' + userId;  // 会议签到/报到 页面
		
		// 将fileID存储到会议数据中meetingQrCode
		// 获取会议信息
		const db = uniCloud.database();
		const meetingRes = db.collection("bni-meeting").doc(meetingId);
		let meetingInfos = await meetingRes.get();
		if (meetingInfos.data.length > 0) {
			let meetingInfo = meetingInfos.data[0];
			console.log('bni-meeting meetingInfo:', meetingInfo);
			// 判断是否需要生成qrcode
			if (meetingInfo.meetingQrCode === undefined || 
				meetingInfo.meetingQrCode == null || 
				meetingInfo.meetingQrCode == '') {
				// 获取qrcode
				let info = {
					path: qrcodePath,
					width: 600,
					env_version: 'release'  // 打开小程序版本：正式版为 "release"，体验版为 "trial"，开发版为 "develop"
				}
				const qrCodeRes = await this.getMpQrCode(info);
				
				let fileExt = 'jpg'
				let typeArr = qrCodeRes.headers['content-type'].split('/');
				if (typeArr.length > 1) {
					fileExt = typeArr[1];
				}
				let filePath = 'bni/qrcode/meeting/' + meetingId + '.' + fileExt;
				// 保存到云存储
				let fileRes = await this.saveMpQrcode(filePath, qrCodeRes.data);
				// 更新会议表中的meetingQrCode
				const updateRes = await meetingRes.update({ meetingQrCode: fileRes.fileID });
				
				return { code: 1, msg: '创建成功，保存到云存储', meetingQrCode: fileRes.fileID };
			} else {
				// 已有qrcode，不需要重新获取和生成
				return { code: 2, msg: '已有qrcode，不需要重新获取和生成', meetingQrCode: meetingInfo.meetingQrCode };
			}
		}
		
		return { code: 1, msg: '错误：无用户信息', meetingQrCode: '' };
	},
	
	/**
	 * 创建并保存全因友你晚宴签到小程序二维码（如果二维码已存在，则不创建）
	 */
	async createAndSaveQuanDinnerQrCode() {
		let qrcodePath = 'pages/launch/welcome' + 
						 '?page=QuanDinnerCheckIn';  // 会议签到/报到 页面
		// 获取qrcode
		let info = {
			path: qrcodePath,
			width: 600,
			env_version: 'release'  // 打开小程序版本：正式版为 "release"，体验版为 "trial"，开发版为 "develop"
		}
		const qrCodeRes = await this.getMpQrCode(info);
		
		let fileExt = 'jpg'
		let typeArr = qrCodeRes.headers['content-type'].split('/');
		if (typeArr.length > 1) {
			fileExt = typeArr[1];
		}
		let filePath = 'quan/qrcode/meeting/dinner_qr_code_' + info.env_version + '.' + fileExt;
		// 保存到云存储
		let fileRes = await this.saveMpQrcode(filePath, qrCodeRes.data);
		const qrUrl = fileRes.fileID.replace("cloud://tcb-cfd7tp6b5t4w37b-7ctoe84b2e2b.7463-tcb-cfd7tp6b5t4w37b-7ctoe84b2e2b-1252168680/", "https://7463-tcb-cfd7tp6b5t4w37b-7ctoe84b2e2b-1252168680.tcb.qcloud.la/");
		
		return { code: 1, msg: '创建成功，保存到云存储', qrCodeID: fileRes.fileID, qrCode: qrUrl };
	},
	
	/**
	 * 创建并保存全因友你是否参录的小程序二维码（如果二维码已存在，则不创建）
	 */
	async createAndSaveAskJoinQrCode() {
		let qrcodePath = 'pages/launch/welcome' + 
						 '?page=askjoin';  // 是否参录 页面
		// 获取qrcode
		let info = {
			path: qrcodePath,
			width: 600,
			env_version: 'release'  // 打开小程序版本：正式版为 "release"，体验版为 "trial"，开发版为 "develop"
		}
		const qrCodeRes = await this.getMpQrCode(info);
		
		let fileExt = 'jpg'
		let typeArr = qrCodeRes.headers['content-type'].split('/');
		if (typeArr.length > 1) {
			fileExt = typeArr[1];
		}
		let filePath = 'quan/qrcode/askjoin/askjoin_qr_code_' + info.env_version + '.' + fileExt;
		// 保存到云存储
		let fileRes = await this.saveMpQrcode(filePath, qrCodeRes.data);
		const qrUrl = fileRes.fileID.replace("cloud://tcb-cfd7tp6b5t4w37b-7ctoe84b2e2b.7463-tcb-cfd7tp6b5t4w37b-7ctoe84b2e2b-1252168680/", "https://7463-tcb-cfd7tp6b5t4w37b-7ctoe84b2e2b-1252168680.tcb.qcloud.la/");
		
		return { code: 1, msg: '创建成功，保存到云存储', qrCodeID: fileRes.fileID, qrCode: qrUrl };
	},
	
	async main(event, context) {
		//event为客户端上传的参数
		console.log('event : ', event);
		
		// 本地测试
		////////////////////////////
		// // 测试用户专属小程序码
		// let userId = '2819d26a655447750293b1e57801ca1f';
		// const result = await this.createAndSaveUserQrCode(userId);
		// console.log('result:', result);
		
		// // 测试会议专属小程序码
		// let meetingId = '7027b6546592d372056f1ecb0a88556b'
		// let userId = '2819d26a655447750293b1e57801ca1f';
		// const result = await this.createAndSaveMeetingQrCode(meetingId, userId);
		// console.log('result:', result);
		
		// // 测试全因友你晚宴签到小程序码
		// const result = await this.createAndSaveQuanDinnerQrCode();
		// console.log('result:', result);
		
		// // 测试是否参录小程序码
		// const result = await this.createAndSaveAskJoinQrCode();
		// console.log('result:', result);
		////////////////////////////
		
		// 正式
		////////////////////////////
		let result = {}
		if (event.businessType !== undefined && 
			event.businessType != null && 
			event.businessType.length > 0) {
			if (event.businessType == 'userQrCode') {
				// 生成用户专属小程序码
				result = await this.createAndSaveUserQrCode(event.userId);
			} else if (event.businessType == 'meetingQrCode') {
				// 生成会议签到小程序码
				result = await this.createAndSaveMeetingQrCode(event.meetingId, event.userId);
			}
		} else {
			// 当作获取用户专属小程序码（兼容旧业务逻辑）
			// 生成用户专属小程序码
			result = await this.createAndSaveUserQrCode(event.userId);
		}
		
		console.log('result:', result);
		////////////////////////////
		
		//返回数据给客户端
		return result;
	}
}